ko.committable = function(initialValue) {
    //private variables
    var _temp = initialValue;
    var _actual = ko.observable(initialValue);

    var result = ko.computed({
        read : _actual,
        write : function(newValue) {
            _temp = newValue;
        }
    });

    //commit the temporary value to our observable, if it is different
    result.commit = function() {
        if (_temp !== _actual()) {
            _actual(_temp);
        }
    };

    //notify subscribers to update their value with the original
    result.reset = function() {
        _actual.valueHasMutated();
        _temp = _actual();
    };

    return result;
};

var Model = function() {

    this.Item = function(objeto) {
        this.idItem = objeto.idItem;
        this.categoria = objeto.categoria;
        this.titulo = objeto.titulo;
        this.anio = objeto.anio;
        this.genero = objeto.genero;
        this.pais = objeto.pais;
        this.wiki = objeto.wikipedia;
        this.sinopsis = objeto.sinopsis;
        this.imagen = objeto.imagen;
        this.estado2 = ko.observable(objeto.estado2);

        if (this.categoria == "libro") {
            this.autor = objeto.autor;
            this.editorial = objeto.editorial;
        } else {
            this.imdb = objeto.imdb;
            this.video = objeto.video;

            if (this.categoria == "serie") {
                this.estado = objeto.estado;
                this.temporadas = objeto.temporadas;
                this.capitulos = [];
            }
        }

        this.actualizarEstado = function(nuevoestado) {
            this.estado2(nuevoestado);
        }
        this.getTitulo = function() {
            return this.titulo;
        }

        this.addCapitulo = function(capitulo) {
            this.capitulos.push(capitulo);
        }

        this.getListaCapitulos = function() {
            return this.capitulos;
        }

        this.getImg = function() {
            return this.imagen;
        }

        this.getId = function() {
            return this.idItem;
        }

        this.getCategoria = function() {
            return this.categoria;
        }

        this.getTemporadas = function() {
            return this.temporadas;
        }

        this.getCapitulos = function(temp) {
            var capis = [];
            for (var i = 0; i < this.capitulos.length; i++) {
                if (this.capitulos[i].temporada == temp) {
                    capis.push(this.capitulos[i]);
                }
            }
            return capis;
        }
    }
    this.Imagenes = function(lista) {
        this.peli1 = lista[0];
        this.peli2 = lista[1];
        this.peli3 = lista[2];
        this.serie1 = lista[3];
        this.serie2 = lista[4];
        this.serie3 = lista[5];
        this.libro1 = lista[6];
        this.libro2 = lista[7];
        this.libro3 = lista[8];
    }

    this.Capitulo = function(objeto) {
        this.idSerie = objeto.idSerie;
        this.idCapitulo = objeto.idCapitulo;
        this.titulo = objeto.titulo;
        this.temporada = objeto.temporada;

    }

    this.Lista = function() {
        var lista = ko.observableArray([]);
        var listaUsuario = ko.observableArray([]);
        this.numero = 5;
    
        this.iconoChange = function(idItem){
            var clase = "."+idItem;
            var itemExiste = this.buscar(listaUsuario(), idItem);
            if (itemExiste === false) {
                $("."+idItem+" > i").removeClass("icon-eye-close").addClass("icon-eye-open");  
            } else {
                $("."+idItem+" > i").removeClass("icon-eye-open").addClass("icon-eye-close");
            }
        }

        this.actualizarArticulos = function(item, estado) {
            
            item.actualizarEstado(estado);
            var itemExiste = this.buscar(listaUsuario(), item.getId());
            if (itemExiste == false) {
                listaUsuario.push(item);
            } else {
                itemExiste.actualizarEstado(estado);
            }

        }
        this.cuantasHay = function(cat, est) {
            var contador = 0;
            for (var i = 0; i < listaUsuario().length; i++) {
                if (listaUsuario()[i].getCategoria() == cat && listaUsuario()[i].estado2() == est) {
                    contador++;
                }
            }
            return contador;
        }

        this.add = function(listas, item) {
        		console.log(item);
        		console.log(listas);
        		listas.push(item);
        }
        
        this.remove = function(id){
        	
        	var posicion = -1;
        	for (var i = 0; i < lista().length; i++){
        		if(lista()[i].getId() == id){
        			posicion = i;
        		}
        	}
        	
        	if(posicion != -1){
        		lista.splice(posicion, 1);
        	}
        }
        
        
        this.getLista = function() {
            return lista();
        }

        this.getListaUsuario = function() {
            return listaUsuario();
        }

        this.buscar = function(listas, id) {
            var obj = false;
            for (var i = 0; i < listas.length; i++) {
                if (id == listas[i].idItem) {
                    var obj = listas[i];
                }
            }

            return obj;
        }

        this.largo = function(listas) {
            return listas.length;
        }

        this.getPelis = function(listas) {
            var pelis = [];
            $.each(listas, function(key, value) {
                if (value.getCategoria() == 'pelicula') {
                    pelis.push(value);
                };

            });
            return pelis;
        }

        this.getSeries = function(listas) {
            var series = [];
            $.each(listas, function(key, value) {
                if (value.getCategoria() == 'serie') {
                    series.push(value);
                };

            });
            return series;
        }

        this.getLibros = function(listas) {
            var libros = [];
            $.each(listas, function(key, value) {
                if (value.getCategoria() == 'libro') {
                    libros.push(value);
                };

            });
            return libros;
        }

        this.getImages = function() {
            var images = [];
            for (var i = 0; i < lista.length; i++) {
                var img = lista[i].getImg();
                images.push(img);
            }
            return images;
        }

        this.ordenarAsc = function(elemento) {
            elemento.sort(function(a, b) {
                return a.getId() - b.getId();
            });
            return elemento;
        }

        this.ordenarDes = function(elemento) {
            elemento.sort(function(a, b) {
                return b.getId() - a.getId();
            });
            return elemento;

        }

        this.hacerCargaCap = function(idItem) {
            var serie = this.buscar(lista, idItem);
            if (serie.getListaCapitulos().length == 0) {
                $.ajax({
                    url: "php/carga_capitulos.php",
                    data: {
                        id: idItem
                    },
                    success: function(lista){
                        var id = lista[0].idSerie;
                        var listaContenido = modelo.listaCatalogo.getLista();
                        var catalogo = modelo.listaCatalogo;
                        var serie = catalogo.buscar(listaContenido, id);
                        
                        $.each(lista, function(key, value){
                            serie.addCapitulo(new modelo.Capitulo(value));
                        });
                        iris.navigate('#/plantilla?id=' + idItem);
                    }
                });
            } else {
                iris.navigate('#/plantilla?id=' + idItem);
            }
            
            
        }
    }

    this.Usuario = function(objeto) {
        this.id_user = ko.observable(objeto.id_user);
        this.user = ko.committable(objeto.user);
        this.password = ko.committable(objeto.password);
        this.nombre = ko.committable(objeto.nombre);
        this.apellido = ko.committable(objeto.apellido);
        this.email = ko.committable(objeto.email);
        
        this.ok = function(){
            this.user.commit();
            this.nombre.commit();
            this.apellido.commit();
            this.email.commit();
        }
        this.cancel = function(){
            this.user.reset();
            this.nombre.reset();
            this.apellido.reset();
            this.email.reset();
        }
    }

    this.crearUsuario = function(object) {
        this.datosUsuario = new this.Usuario(object);
    }

    this.listaCatalogo = new this.Lista();

    //this.elemento = new this.Item(objeto);

}
var modelo = new Model();

